﻿using QldtSdh.GUI.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using QldtSdh.BLL;
using QldtSdh.DAL.Models;
using QldtSdh.Utils;
using System.Threading;
namespace QldtSdh.GUI.KhaoThi
{
    public partial class UcQuanLyDotThi : QldtSdh.GUI.Common.BaseUserControl, Common.IHocKyChangable
    {
        public DAL.Models.HocKy HocKy { get; private set; }
        bool allowUpdate = false;
        private CEMS4UG_DHKHContext _dbContext = null;

        public CEMS4UG_DHKHContext DBContext
        {
            get
            {
                if (_dbContext == null)
                    _dbContext = CEMS4UG_DHKHContext.GetContext();
                return _dbContext;
            }
        }

        public void SetHocKy(DAL.Models.HocKy newHocKy)
        {
            this.HocKy = newHocKy;
            LoadDSDotThi();
        }

        public void ChangeHocKy(DAL.Models.HocKy newHocKy)
        {
            // if (newHocKy != this.HocKy)
            this.SetHocKy(newHocKy);
        }

        public UcQuanLyDotThi()
        {
            InitializeComponent();
            gridDotThi.AddRowIndexing();
            gridLop.AddRowIndexing();
            gridHocVien.AddRowIndexing();
            LoadPhongThi();
        }

        void LoadDSDotThi()
        {
            allowUpdate = false;
            gridDotThi.AutoGenerateColumns = false;
            var ls = BizDotThi.GetList(HocKy.MaHocKyGUID, DBContext);
            bdDotThi.DataSource = ls;
            gridDotThi.DataSource = bdDotThi;
            if (ls != null && ls.Count > 0)
                btnDotThi_In.Enabled = btnDotThi_Xoa.Enabled = btDotThi_ChinhSua.Enabled = true;
            else
                btnDotThi_In.Enabled = btnDotThi_Xoa.Enabled = btDotThi_ChinhSua.Enabled = false;
            LoadLopHocPhan();
        }

        void LoadLopHocPhan()
        {
            gridLop.AutoGenerateColumns = false;
            var dotThi = bdDotThi.Current as DotThi;
            bdLop.DataSource = null;
            if (dotThi != null)
            {
                btnLopHocPhanThi_BoSung.Enabled = true;
                var ls = BizDotThi_LopHocPhan.GetList(dotThi.MaDotThiGUID);
                bdLop.DataSource = ls;
                if (ls != null && ls.Count > 0)
                    btnInDsDuocChon.Enabled = btnChonTatCa.Enabled = btnDanhSachThi_BoSung.Enabled = btnLuuThongTin.Enabled = btnLopHocPhanThi_Xoa.Enabled = true;
                else
                    btnInDsDuocChon.Enabled = btnChonTatCa.Enabled = btnDanhSachThi_BoSung.Enabled = btnLuuThongTin.Enabled = btnLopHocPhanThi_Xoa.Enabled = false;
            }
            else
                btnLopHocPhanThi_BoSung.Enabled = false;
            gridLop.DataSource = bdLop;
            LoadChiTietLichThi();
            LoadDSHOCVIEN();
        }

        void LoadPhongThi()
        {
            var ls = BizPhongHoc.GetList(DBContext);
            if (ls != null)
                ls.Insert(0, new PhongHoc { MaPhongHoc = "-1", TenPhongHoc = "Không xác định" });
            cmbPhongThi.DataSource = ls;
            cmbPhongThi.DisplayMember = "TenPhongHoc";
            cmbPhongThi.ValueMember = "MaPhongHoc";
        }

        void LoadChiTietLichThi()
        {
            var dtlopHocPhan = bdLop.Current as DotThi_LopHocPhan;
            if (dtlopHocPhan != null)
            {
                dtNgayThi.Value = dtlopHocPhan.NgayThi.HasValue ? dtlopHocPhan.NgayThi.Value : DateTime.Now;
                cmbGioThi.Text = dtlopHocPhan.GioThi.IsNullOrEmpty() ? "" : dtlopHocPhan.GioThi;
                cmbHinhThucThi.Text = dtlopHocPhan.HinhThucThi;
                if (!dtlopHocPhan.MaPhongHoc.IsNullOrEmpty())
                    cmbPhongThi.SelectedValue = dtlopHocPhan.MaPhongHoc;
                else
                    cmbPhongThi.SelectedIndex = 0;
                var lophocPhan = BizLopHocPhan.GetByID(dtlopHocPhan.MaLopHocPhanGUID);
                if (lophocPhan != null)
                {
                    var hocPhan = BizHocPhan.GetByID(lophocPhan.MaHocPhanGUID, DBContext);
                    if (hocPhan != null)
                        txtHocPhanChiTiet.Text = string.Format("[{0}]{1}({2}TC)", hocPhan.MaHocPhan, hocPhan.TenHocPhan, hocPhan.SoTinChi);
                    else
                        txtHocPhanChiTiet.Text = "Học phần không tồn tại";
                }
            }
            else
            {
                dtNgayThi.Value = DateTime.Now;
                cmbGioThi.Text = "";
                cmbHinhThucThi.Text = "";
                if (cmbPhongThi.SelectedIndex != -1)
                    cmbPhongThi.SelectedIndex = 0;
                txtHocPhanChiTiet.Text = "";
            }
        }

        void LoadDSHOCVIEN()
        {
            gridHocVien.AutoGenerateColumns = false;
            var dotThi = bdDotThi.Current as DotThi;
            var lopHocPhan = bdLop.Current as DotThi_LopHocPhan;
            bdHocVien.DataSource = null;
            btnInDanhSachDuThi.Enabled = false;
            if (dotThi != null && lopHocPhan != null)
            {
                var ls = BizLopHocPhan_BangDiem_HocVien.GetListHocVien(dotThi.MaDotThiGUID, lopHocPhan.MaLopHocPhanGUID);
                bdHocVien.DataSource = ls;
                if (ls != null)
                    btnInDanhSachDuThi.Enabled = true;
            }
            gridHocVien.DataSource = bdHocVien;
            allowUpdate = true;
        }

        private void btnDotThi_In_Click(object sender, EventArgs e)
        {
            var dotThi = bdDotThi.Current as DotThi;
            if (dotThi != null)
            {
                var ls = LichThi.GetList(dotThi);
                if (ls != null && ls.Count > 0)
                {
                    FormInLichThi f = new FormInLichThi();
                    f.ShowOrPrint(dotThi.TenDotThi, HocKy, ls, false, false);
                }
                else
                {
                    DialogUtils.ShowMessage("Bạn chưa lập danh sách lớp học phần thi trong học kỳ này");
                }
            }
        }

        private void btnDotThi_BoSung_Click(object sender, EventArgs e)
        {
            var dlg = new FormQuanLyDotThi_ChiTiet(HocKy);
            if (dlg.ShowDialog() == DialogResult.OK)
                LoadDSDotThi();
        }

        private void btDotThi_ChinhSua_Click(object sender, EventArgs e)
        {
            var dotThi = bdDotThi.Current as DotThi;
            if (dotThi != null)
            {
                var dlg = new FormQuanLyDotThi_ChiTiet(HocKy, dotThi);
                if (dlg.ShowDialog() == DialogResult.OK)
                    LoadDSDotThi();
            }
        }

        private void btnDotThi_Xoa_Click(object sender, EventArgs e)
        {
            var dotThi = bdDotThi.Current as DotThi;
            if (dotThi != null)
            {
                if (DialogUtils.ShowOKCancel("Bạn có chắc là muốn xóa đợt thi này?") == DialogResult.OK)
                {
                    var rs = BizDotThi.Delete(dotThi.MaDotThiGUID);
                    if (rs == CODE_RESULT_RETURN.ThanhCong)
                        bdDotThi.RemoveCurrent();
                    else
                        DialogUtils.ShowError("Không thể xóa đợt thi này");
                }
            }
        }

        private void btnLopHocPhanThi_BoSung_Click(object sender, EventArgs e)
        {
            var dotThi = bdDotThi.Current as DotThi;
            if (dotThi != null)
            {
                var dlg = new FormQuanLyDotThi_BoSungLopHocPhan(dotThi);
                dlg.OnChanged += (o, t) =>
                {
                    LoadLopHocPhan();
                };
                dlg.ShowDialog();
            }
        }

        private void btnDanhSachThi_BoSung_Click(object sender, EventArgs e)
        {
            //var dlg = new Common.FormChonHocVien();
            //dlg.ShowDialog();
            var lopHP = bdLop.Current as DotThi_LopHocPhan;
            var dotThi = bdDotThi.Current as DotThi;
            if (lopHP != null && dotThi != null)
            {
                var frm = new FormDanhSachHocVien_LopHocPhan_BoSung(lopHP.MaLopHocPhanGUID, dotThi.MaDotThiGUID);
                frm.OnChanged += (o, t) =>
                {
                    LoadDSHOCVIEN();
                };
                frm.ShowDialog();
            }
        }

        private void bdDotThi_CurrentChanged(object sender, EventArgs e)
        {
            if (allowUpdate)
            {
                var dotThi = bdDotThi.Current as DotThi;
                if (dotThi != null)
                    btnDotThi_In.Enabled = btnDotThi_Xoa.Enabled = btDotThi_ChinhSua.Enabled = true;
                else
                    btnDotThi_In.Enabled = btnDotThi_Xoa.Enabled = btDotThi_ChinhSua.Enabled = false;
                LoadLopHocPhan();
            }
        }

        private void bdLop_CurrentChanged(object sender, EventArgs e)
        {
            if (allowUpdate)
            {
                var lop = bdLop.Current as DotThi_LopHocPhan;
                if (lop != null)
                {
                    btnDanhSachThi_BoSung.Enabled = btnLuuThongTin.Enabled = btnLopHocPhanThi_Xoa.Enabled = true;
                }
                else
                    btnDanhSachThi_BoSung.Enabled = btnLuuThongTin.Enabled = btnLopHocPhanThi_Xoa.Enabled = false;
                LoadChiTietLichThi();
                LoadDSHOCVIEN();
            }
        }

        private void btnLopHocPhanThi_Xoa_Click(object sender, EventArgs e)
        {
            var dt_lopHP = bdLop.Current as DotThi_LopHocPhan;
            if (dt_lopHP != null)
            {
                if (DialogUtils.ShowOKCancel(NOTIFY_CONSTANT_STRING.DELETE) == DialogResult.OK)
                {
                    var rs = BizDotThi_LopHocPhan.Delete(dt_lopHP.MaDotThiGUID, dt_lopHP.MaLopHocPhanGUID);
                    if (rs == CODE_RESULT_RETURN.ThanhCong)
                    {
                        bdLop.RemoveCurrent();
                        gridLop.Refresh();
                    }
                    else
                        DialogUtils.ShowError("Không thể xóa lớp học phần trong đợt thi này.");
                }
            }
        }

        private void bdHocVien_CurrentChanged(object sender, EventArgs e)
        {
            if (allowUpdate)
            {
                var hocVien = bdHocVien.Current as HocVien;
                if (hocVien != null)
                    btnDanhSachThi_Xoa.Enabled = true;
                else
                    btnDanhSachThi_Xoa.Enabled = false;
            }
        }

        bool ValidateData()
        {
            errorNotify.Clear();
            if (cmbGioThi.Text.IsNullOrEmpty())
            {
                errorNotify.SetError(cmbGioThi, "Bạn chưa nhập giờ thi");
                return false;
            }
            if (cmbPhongThi.SelectedIndex == -1)
            {
                errorNotify.SetError(cmbPhongThi, "Bạn chưa chọn phòng");
                return false;
            }
            if (cmbHinhThucThi.Text.IsNullOrEmpty())
            {
                errorNotify.SetError(cmbHinhThucThi, "Bạn chưa chọn hình thức thi");
                return false;
            }
            return true;
        }

        private void btnLuuThongTin_Click(object sender, EventArgs e)
        {
            if (ValidateData())
            {
                var dtLopHocPhan = bdLop.Current as DotThi_LopHocPhan;
                if (dtLopHocPhan != null)
                {
                    if (cmbPhongThi.SelectedValue.ToString() != "-1")
                        dtLopHocPhan.MaPhongHoc = cmbPhongThi.SelectedValue.ToString();
                    else
                        dtLopHocPhan.MaPhongHoc = null;
                    dtLopHocPhan.NgayThi = dtNgayThi.Value;
                    dtLopHocPhan.GioThi = cmbGioThi.Text;
                    dtLopHocPhan.HinhThucThi = cmbHinhThucThi.Text;
                    var rs = BizDotThi_LopHocPhan.Update(dtLopHocPhan);
                    if (rs == CODE_RESULT_RETURN.ThanhCong)
                        DialogUtils.ShowMessage("Đã lưu thông tin lịch thi cho lớp học phần " + dtLopHocPhan._TenLopHocPhanFull + " thành công!");
                    else
                        DialogUtils.ShowError("Xảy ra lỗi trong quá trình cập nhật");
                }
            }
        }

        private void btnDanhSachThi_Xoa_Click(object sender, EventArgs e)
        {
            var hocVien = bdHocVien.Current as HocVien;
            var lopHP = bdLop.Current as DotThi_LopHocPhan;
            var dotThi = bdDotThi.Current as DotThi;
            if (hocVien != null && lopHP != null && dotThi != null)
            {
                if (DialogUtils.ShowOKCancel(NOTIFY_CONSTANT_STRING.DELETE) == DialogResult.OK)
                {
                    var rs = BizLopHocPhan_BangDiem_HocVien.Delete(hocVien.MaHocVien,
                        lopHP.MaLopHocPhanGUID, dotThi.MaDotThiGUID);
                    if (rs == CODE_RESULT_RETURN.ThanhCong)
                    {
                        bdHocVien.RemoveCurrent();
                        gridHocVien.Refresh();
                    }
                    else
                        DialogUtils.ShowError("Không thể xóa học viên này ra khỏi danh sách thi.");
                }
            }
        }

        private void btnInDanhSachDuThi_Click(object sender, EventArgs e)
        {
            var ls = bdHocVien.DataSource as List<HocVien>;
            if (ls != null && ls.Count > 0)
            {
                var dt_lhp = bdLop.Current as DotThi_LopHocPhan;
                if (dt_lhp != null)
                {
                    var lhp = BizLopHocPhan.GetByID(dt_lhp.MaLopHocPhanGUID);
                    if (lhp != null)
                    {
                        var hp = BizHocPhan.GetByID(lhp.MaHocPhanGUID);
                        if (hp != null)
                        {
                            var f = new FormInDanhSachDuThi();
                            f.ShowOrPrint(hp, lhp, ls, dt_lhp, true);
                        }
                    }
                }
            }
        }

        bool selected = true;

        private void btnChonTatCa_Click(object sender, EventArgs e)
        {
            var ls = bdLop.DataSource as List<DotThi_LopHocPhan>;
            if (ls != null && ls.Count > 0)
            {
                foreach (var item in ls)
                    item._IsSelected = selected;
                selected = !selected;
                gridLop.Refresh();
            }
        }

        private void btnInDsDuocChon_Click(object sender, EventArgs e)
        {
            gridLop.EndEdit();
            var lsLopHP = bdLop.DataSource as List<DotThi_LopHocPhan>;
            if (lsLopHP != null && lsLopHP.Count > 0)
            {
                int i = 0;
                int total = lsLopHP.FindAll(t => t._IsSelected == true).Count;
                var f = new FormInDanhSachDuThi();
                foreach (var item in lsLopHP)
                {
                    i++;
                    if (item._IsSelected)
                    {
                        var lsHV = bdHocVien.DataSource as List<HocVien>;
                        if (lsHV != null && lsHV.Count > 0)
                        {
                            var lhp = BizLopHocPhan.GetByID(item.MaLopHocPhanGUID);
                            if (lhp != null)
                            {
                                var hp = BizHocPhan.GetByID(lhp.MaHocPhanGUID);
                                if (hp != null)
                                {
                                    if (f != null)
                                        f = new FormInDanhSachDuThi();
                                    if (i == total)
                                        f.ShowOrPrint(hp, lhp, lsHV, item, false, false);
                                    else
                                        f.ShowOrPrint(hp, lhp, lsHV, item, false, true);
                                    Thread.Sleep(2000);
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                DialogUtils.ShowMessage("Vui lòng tick vào lớp học phần muốn in danh sách");
            }
        }
    }
}
